package com.whfp.coky.utils

import com.seuic.sleduhf.UhfCallback
import com.seuic.sleduhf.UhfDevice
import com.whfp.coky.App
import com.whfp.coky.other.Constants
import java.math.BigInteger

/**
 *
 *
 * created by coky on 2022/3/31
 */
class RFIDTool {

    //搜索到设备蓝牙
    var WHAT_GET_BT_INFO = 264210

    //返回了连接状态
    var WHAT_GET_CONNECT_STATUS = 264211

    //寻到了卡
    var WHAT_GET_TAGS_ID = 264212

    //返回了寻卡状态
    var WHAT_GET_SCAN_KEY_MODE = 264213

    //返回了扫描条信息
    var WHAT_DECODE_COMPLETE = 264214



    companion object{
        //当前已连接成功的设备型号
        val deviceXH =Constants.DEV_TYPE_RFID
        val mDevice = UhfDevice.getInstance(App.instance)

//        16进制字符串转10进制
        fun hexStr2str(hexStr:String)= BigInteger(hexStr, 16).toString()


        @Volatile
        private var instance: RFIDTool? = null

        fun getInstance(): RFIDTool {
            if (instance == null) {
                synchronized(RFIDTool::class.java) {
                    if (instance == null) {
                        instance = RFIDTool()
                    }
                }
            }
            return instance!!
        }
    }




    private constructor()


    /**
     * 单例模式 获取实例方法
     *
     * @return
     */
    fun getInstance(): RFIDTool? {
        if (instance == null) {
            synchronized(RFIDTool::class.java) {
                if (instance == null) {
                    instance = RFIDTool()
                }
            }
        }
        return instance
    }

    /**
     * 注册回调事件0
     */
    fun register(callback: UhfCallback?) {
        mDevice.let { 
            it.registerUhfCallback(callback)
        }
    }

    /**
     * 注销回调事件
     */
    fun unRegister(callback: UhfCallback?) {
        mDevice.let {
            it.unregisterUhfCallback(callback)
        }
    }

    /**
     * 获取电量信息
     */
    fun getBatteryInfo() = mDevice.batteryInfo

    /**
     * 读标签
     *
     * @param epc      标签的ID（PC+EPC）
     * @param password 访问密码（长度为4个字节）
     * @param bank     标签的存储区（0：密码区  1：EPC区  2：TI区  3：用户区）
     * @param offset   起始地址（单位为字节）(必须是2的整数倍)
     * @param len      要读取的数据长度，单位为字节(必须是2的整数倍)
     * @param data     存放读到的数据
     * @return
     */
    fun readTagData(
        epc: ByteArray?,
        password: ByteArray?,
        bank: Int,
        offset: Int,
        len: Int,
        data: ByteArray?
    ): Boolean {
        return mDevice!!.readTagData(
                epc,
                password,
                bank,
                offset,
                len,
                data
            )
    }

    /**
     * 写标签
     *
     * @param epc      标签的ID（PC+EPC）
     * @param password 访问密码（长度为4个字节）
     * @param bank     标签的存储区（0：密码区  1：EPC区  2：TI区  3：用户区）
     * @param offset   起始地址（单位为字节）(必须是2的整数倍)
     * @param len      要读取的数据长度，单位为字节(必须是2的整数倍)
     * @param data     存放准备要写入标签的数据
     * @return
     */
    fun writeTagData(
        epc: ByteArray?,
        password: ByteArray?,
        bank: Int,
        offset: Int,
        len: Int,
        data: ByteArray?
    ): Boolean {
        return mDevice!!.writeTagData(
                epc,
                password,
                bank,
                offset,
                len,
                data
            )
    }


    /**
     * 连接设备
     *
     * @param mac     设备MAC地址
     * @param timeout 设备超时时间
     */
    fun connect(mac: String?, timeout: Int) {
        mDevice.connect(mac, timeout)
    }

    /**
     * 断开连接
     */
    fun disconnect() {
        mDevice.disconnect()
    }

    /**
     * 十六进制String转byte[]
     *
     * @param hexString 要转的数据
     * @return
     */
    fun hexStringToBytes(hexString: String?)= hexString?.decodeHex()


    fun charToByte(c: Char)= "0123456789ABCDEF".indexOf(c).toByte()

//    扩展方法
    fun String.decodeHex() = chunked(2)
        .map {
            it.toByte(16)
        }.toByteArray()

}